package com.luoqy.speedy.common;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.util.Map;

import org.apache.ibatis.jdbc.ScriptRunner;

import com.luoqy.speedy.data.DataBase;
import com.luoqy.speedy.data.MySql;

/**
 * @author luoqy
 * @date 2019年6月2日 第一次启动系统时候进行的操作
 */
public class FirstCreateBase {
	/**
	 *  对JAR包进行解压
	 * */
	public static void unlock(){
		try{
			String os = System.getProperty("os.name").toLowerCase();
			String path=FirstCreateBase.class.getResource("/").getPath();
			if(path.contains(".jar")){
				path=path.split(".jar")[0]+".jar";
			}
			path=path.replace("file:/","");
			System.err.println(path);
			if (os.startsWith("win")) {
				WindowsDos.runCMD("jar -xvf "+path);
			}else{
				LinuxDos.executeLinuxCmd("jar -xvf "+path);
			}
		}catch (Exception e){
			e.printStackTrace();
		}
	}
	/**
	 *  当配置数据库数进行数据执行
	 * */
	public static boolean init(){
		unlock();
		//判断是否第一次进入，是否已存在数据库
		Map<String, String> jdbc=ConfigManage.findProperties("jdbc");
		return createDatabase(jdbc);
	}
	/**
	 * 根据基础库创建集
	 */
	public static boolean createDatabase(Map<String, String> map) {
		try {
			Class.forName(map.get("driverClass"));
			// 一开始必须填一个已经存在的数据库
			String url = map.get("url").replaceAll("speedy","mysql");
			Connection conn = DriverManager.getConnection(url, map.get("account"), map.get("password"));
			Statement stat = conn.createStatement();
			// 创建数据库speedy
			stat.executeUpdate("create database IF NOT EXISTS speedy DEFAULT CHARSET utf8 COLLATE utf8_general_ci");
			return runSql(map);
		} catch (Exception e) {
			System.err.println("初始化失败："+e.getMessage()+"=[请监测数据库配置文件]");
			// TODO: handle exception
			return false;
		}
	}
	/**
	 *  执行Mysql文件写入到数据库
	 * */
	public static boolean runSql(Map<String, String> dataBase) {
		try {
			// 获取数据库相关配置信息
			Map<String, String> props = dataBase;

			// jdbc 连接信息: 注: 现在版本的JDBC不需要配置driver，因为不需要Class.forName手动加载驱动
			String url = props.get("url");
			String username = props.get("account");
			String password = props.get("password");
			// 建立连接
			Connection conn = DriverManager.getConnection(url, username, password);
			Object data=MySql.SELECT("select * from information_schema.SCHEMATA where SCHEMA_NAME = 'speedy'", "", new DataBase());
			if(null==data){
				// 创建ScriptRunner，用于执行SQL脚本
				ScriptRunner runner = new ScriptRunner(conn);
				runner.setErrorLogWriter(null);
				runner.setLogWriter(null);
				// 执行SQL脚本Resources.getResourceAsReader("speedy.sql")
				String filePath = System.getProperty("user.dir")+ "/config/speedy.sql";
				
			       InputStream speedy = new BufferedInputStream(new FileInputStream(filePath));
				runner.runScript(new InputStreamReader(speedy, "utf-8"));
				// 若成功，打印提示信息
				System.err.println("====== SUCCESS ======");
				// 关闭连接
				conn.close();
				return true;
			}else{
				//数据库已存在
				conn.close();
				return true;
			}
		
			
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
}
